/* USER CODE BEGIN Header */
/**************************************************************
 * @file     freeRTOS.c
 * @brief    freeRTOS核心文件
 * @author   Ruilist
 * @date     2025-07-26
 * @version  V1.0.0
 * @copyright Copyright (c) 2025
 *
 * @note     1 tab = 4 space
 *
 * @par 日志:
 * - V1.0.0 2025-07-25 Ruilist
 **************************************************************/
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"
#include "queue.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "bsp_key.h"
#include "bsp_led.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */

/* USER CODE END Variables */
/* Definitions for defaultTask */
osThreadId_t         defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
    .name       = "defaultTask",
    .stack_size = 128 * 4,
    .priority   = (osPriority_t)osPriorityNormal,
};

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */

/* USER CODE END FunctionPrototypes */

void StartDefaultTask( void *argument );

void MX_FREERTOS_Init( void ); /* (MISRA C 2004 rule 8.1) */

/**
 * @brief  FreeRTOS initialization
 * @param  None
 * @retval None
 */
void MX_FREERTOS_Init( void )
{
    /* USER CODE BEGIN Init */

    /* USER CODE END Init */

    /* USER CODE BEGIN RTOS_MUTEX */
    /* add mutexes, ... */
    /* USER CODE END RTOS_MUTEX */

    /* USER CODE BEGIN RTOS_SEMAPHORES */
    /* add semaphores, ... */
    /* USER CODE END RTOS_SEMAPHORES */

    /* USER CODE BEGIN RTOS_TIMERS */
    /* start timers, add new ones, ... */
    /* USER CODE END RTOS_TIMERS */

    /* USER CODE BEGIN RTOS_QUEUES */
    /* add queues, ... */
    /* USER CODE END RTOS_QUEUES */

    /* Create the thread(s) */
    /* creation of defaultTask */
    defaultTaskHandle = osThreadNew( StartDefaultTask, NULL, &defaultTask_attributes );

    key_TaskHandle = osThreadNew( key_task_func, NULL, &key_Task_attributes );

    led_TaskHandle = osThreadNew( led_task_func, NULL, &led_Task_attributes );

    /* USER CODE BEGIN RTOS_THREADS */
    /* add threads, ... */
    /* USER CODE END RTOS_THREADS */

    /* USER CODE BEGIN RTOS_EVENTS */
    /* add events, ... */
    /* USER CODE END RTOS_EVENTS */
}

/* USER CODE BEGIN Header_StartDefaultTask */
/**
 * @brief  Function implementing the defaultTask thread.
 * @param  argument: Not used
 * @retval None
 */
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask( void *argument )
{
    /* USER CODE BEGIN StartDefaultTask */
    led_operation_t key_queue_receive   = LED_ON;
    led_operation_t led_operation_value = LED_ON;
    /* Infinite loop */
    for ( ;; )
    {
        printf( "Start DefaultTask\r\n" );
        if ( key_queue != 0 )
        {
            if ( pdTRUE == xQueueReceive( key_queue, &( key_queue_receive ), (TickType_t)0 ) )
            {
                printf( "received key queue value = [%d] at time=[%d]\r\n", key_queue_receive, HAL_GetTick() );
                led_operation_value = key_queue_receive;
                if ( pdTRUE == xQueueSendToFront( led_queue, &led_operation_value, 0 ) )
                {
                    printf( "led send successfully at time=[%d]\r\n", HAL_GetTick() );
                }
            }
        }
        osDelay( 100 );
    }
    /* USER CODE END StartDefaultTask */
}

/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */

/* USER CODE END Application */
